package com.sunrise.configuracoes.repositorio;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.sunrise.configuracoes.repositorio.iface.SituacaoTributariaDao;
import com.sunrise.generico.acesso.DaoService;
import com.sunrise.generico.entidade.SituacaoTributaria;
import com.sunrise.generico.enums.TipoImposto;
import com.sunrise.generico.visao.Filtro;

@Repository
public class SituacaoTributariaDaoImpl extends DaoService<SituacaoTributaria> implements SituacaoTributariaDao {

	public List<SituacaoTributaria> listarOrdenado() {
		List<SituacaoTributaria> list = listar(SituacaoTributaria.class);
		Collections.sort(list, new Comparator<SituacaoTributaria>() {

			@Override
			public int compare(SituacaoTributaria o1, SituacaoTributaria o2) {
				return o1.getNome().compareTo(o2.getNome());
			}
		});
		return list;
	}

	public List<SituacaoTributaria> search(SituacaoTributaria ex) {
		List<SituacaoTributaria> list =  searchByExample(SituacaoTributaria.class, ex);
		Collections.sort(list, new Comparator<SituacaoTributaria>() {

			@Override
			public int compare(SituacaoTributaria o1, SituacaoTributaria o2) {
				return o1.getNome().compareTo(o2.getNome());
			}
		});
		return list;
	}

	public SituacaoTributaria getById(Long id) {
		return getById(id, SituacaoTributaria.class);
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	public List<SituacaoTributaria> listarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(SituacaoTributaria.class);
		crit.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE));
		return crit.list();
	}
	
	@SuppressWarnings("unchecked")
	public List<SituacaoTributaria> listarAtivosPorImposto(TipoImposto imposto, Boolean ativo) {
		Criteria crit = getSession().createCriteria(SituacaoTributaria.class);
		crit.add(Restrictions.eq("tipoImposto", imposto));

		if(ativo != null){
			crit.add(Restrictions.eq("ativo", ativo));
		}
		crit.addOrder(Order.asc("id"));
		
		return crit.list();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public Collection<SituacaoTributaria> buscarPorFiltros(Filtro situacaoTributaria) {
		Criteria crit = getSession().createCriteria(SituacaoTributaria.class);
		if (situacaoTributaria.getNome() != null) {
			crit.add(Restrictions.ilike("nome", situacaoTributaria.getNome(),
					MatchMode.ANYWHERE));
		}

		if (situacaoTributaria.getCodigo() != null && !situacaoTributaria.getCodigo().isEmpty()) {
			crit.add(Restrictions.eq("codigo", situacaoTributaria.getCodigo()));
		}
		
		if (situacaoTributaria.getTipoImposto() != null) {
			crit.add(Restrictions.eq("tipoImposto", situacaoTributaria.getTipoImposto()));
		}
		
		if (situacaoTributaria.getAtivo() != null) {
			crit.add(Restrictions.eq("ativo", situacaoTributaria.getAtivo().getCodigo()));
		}
		
		if (situacaoTributaria.getPadrao() != null) {
			crit.add(Restrictions.eq("padrao", situacaoTributaria.getPadrao().getCodigo()));
		}
		
		crit.addOrder(Order.asc("id"));
		
		return crit.list();
	}

	@Override
	public SituacaoTributaria buscarPorCodigo(String cst) {
		Criteria crit = getSession().createCriteria(SituacaoTributaria.class);
		crit.add(Restrictions.eq("codigo", cst));
		return (SituacaoTributaria) crit.uniqueResult();
	}

	@Override
	public SituacaoTributaria buscarPorImpostoECodigo(TipoImposto tipoImposto, String cst) {
		Criteria crit = getSession().createCriteria(SituacaoTributaria.class);
		crit.add(Restrictions.eq("codigo", cst));
		crit.add(Restrictions.eq("tipoImposto", tipoImposto));
		return (SituacaoTributaria) crit.uniqueResult();
	}
	
	@Override
	public SituacaoTributaria buscarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(SituacaoTributaria.class);
		crit.add(Restrictions.eq("nome", nome).ignoreCase());
		return (SituacaoTributaria) crit.uniqueResult();
	}

	@Override
	public SituacaoTributaria buscarPorSituacaoPadrao(TipoImposto tipoImposto) {
		Criteria crit = getSession().createCriteria(SituacaoTributaria.class);
		crit.add(Restrictions.eq("tipoImposto", tipoImposto));
		crit.add(Restrictions.eq("padrao", true));
		return (SituacaoTributaria) crit.uniqueResult();
	}

}
